<?php

/**
 * Clase para manejar las tablas de transacciones
 *
 * Contiene las operaciones CRUD para las tablas 
 * registro_archivo y registro_registro
 *
 * @author Wilmer Machuca wilmer-machuca@hotmail.com
 */
class transacciones {

    public $procesar;
    private $config;
    public $cant;

    /**
     * Constructor de la clase
     * @access public
     */
    public function __construct() {
        $this->cant = 0;
    }

    /**
     * Trae todas las transacciones segun los filtros aplicados
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function consultarFiltros($filtros, $xoopsDB) {

        $query = "SELECT rr .* , rf.nombres AS beneficiario, rf.identificacion AS idBeneficiario
                    FROM registro_registro AS rr
                    LEFT JOIN registro_familia AS rf ON ( rf.numero_cuenta = rr.numeroCuenta ) ";
        $and = 0;
        if ($filtros['nro_cuenta'] != '') {
            if ($and == 0) {
                $query .= "WHERE ";
            }
            if ($and == 1) {
                $query .= "AND ";
            }
            $query .= 'rr.numeroCuenta LIKE "%' . $filtros['nro_cuenta'] . '%"';
            $and = 1;
        }
        if ($filtros['fec_pro_ini'] != '' && $filtros['fec_pro_fin'] != '') {
            if ($and == 0) {
                $query .= "WHERE ";
            }
            if ($and == 1) {
                $query .= "AND ";
            }
            $query .= 'STR_TO_DATE(rr.fechaProceso, "%Y%m%d") BETWEEN "' . date("Y-m-d", strtotime($filtros['fec_pro_ini'])) . '" AND "' . date("Y-m-d", strtotime($filtros['fec_pro_fin'])) . '" ';
            $and = 1;
        }

        print $query;
        $res = $xoopsDB->query($query);
        $transacciones = array();
        $q = 1;
        while ($myrow = $xoopsDB->fetchArray($res)) {
            $transacciones[$q]['idregistro_registro'] = $myrow['idregistro_registro'];
            $transacciones[$q]['beneficiario'] = $myrow['beneficiario'];
            $transacciones[$q]['idBeneficiario'] = $myrow['idBeneficiario'];
            $transacciones[$q]['tipo'] = $myrow['tipo'];
            $transacciones[$q]['fechaProceso'] = $myrow['fechaProceso'];
            $transacciones[$q]['numeroCuenta'] = strval(number_format($myrow['numeroCuenta'], 0, '', ''));
            $transacciones[$q]['fechaSistema'] = $myrow['fechaSistema'];
            $transacciones[$q]['hora'] = $myrow['hora'];
            $transacciones[$q]['terminal'] = $myrow['terminal'];
            $transacciones[$q]['talon'] = $myrow['talon'];
            $transacciones[$q]['valorCheque'] = formatear_moneda($myrow['valorCheque']);
            $transacciones[$q]['valorPesos'] = formatear_moneda($myrow['valorPesos']);
            $transacciones[$q]['valorUnidadPesos'] = formatear_moneda($myrow['valorUnidadPesos'], 4);
            $transacciones[$q]['oficinaRecaudo'] = $myrow['oficinaRecaudo'];
            $transacciones[$q]['motivo'] = $myrow['motivo'];
            $transacciones[$q]['referenciaUno'] = strval(number_format($myrow['referenciaUno'], 0, '', ''));
            $transacciones[$q]['referenciaDos'] = strval(number_format($myrow['referenciaDos'], 0, '', ''));
            $transacciones[$q]['saldo'] = formatear_moneda($myrow['saldo']);
            $transacciones[$q]['indicadorExcento'] = $myrow['indicadorExcento'];
            $transacciones[$q]['valorExcentos'] = formatear_moneda($myrow['valorExcentos']);
            $transacciones[$q]['canal'] = $myrow['canal'];
            $transacciones[$q]['causalDevolucion'] = $this->descripcionCD($myrow['causalDevolucion']);
            $transacciones[$q]['jornada'] = $myrow['jornada'];
            $q++;
        }
        return $transacciones;

        if ($transacciones) {
            return $transacciones;
        } else {
            return false;
        }
    }

    /**
     * Trae todas las transacciones
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function consultarAll($xoopsDB) {

        $query = "SELECT rr .* , rf.nombres AS beneficiario, rf.identificacion AS idBeneficiario
                    FROM registro_registro AS rr
                    LEFT JOIN registro_familia AS rf ON ( rf.numero_cuenta = rr.numeroCuenta ) ";
        $res = $xoopsDB->query($query);
        $transacciones = array();
        $q = 1;
        while ($myrow = $xoopsDB->fetchArray($res)) {
            $transacciones[$q]['idregistro_registro'] = $myrow['idregistro_registro'];
            $transacciones[$q]['beneficiario'] = $myrow['beneficiario'];
            $transacciones[$q]['idBeneficiario'] = $myrow['idBeneficiario'];
            $transacciones[$q]['tipo'] = $myrow['tipo'];
            $transacciones[$q]['fechaProceso'] = $myrow['fechaProceso'];
            $transacciones[$q]['numeroCuenta'] = strval(number_format($myrow['numeroCuenta'], 0, '', ''));
            $transacciones[$q]['fechaSistema'] = $myrow['fechaSistema'];
            $transacciones[$q]['hora'] = $myrow['hora'];
            $transacciones[$q]['terminal'] = $myrow['terminal'];
            $transacciones[$q]['talon'] = $myrow['talon'];
            $transacciones[$q]['valorCheque'] = formatear_moneda($myrow['valorCheque']);
            $transacciones[$q]['valorPesos'] = formatear_moneda($myrow['valorPesos']);
            $transacciones[$q]['valorUnidadPesos'] = formatear_moneda($myrow['valorUnidadPesos'], 4);
            $transacciones[$q]['oficinaRecaudo'] = $myrow['oficinaRecaudo'];
            $transacciones[$q]['motivo'] = $myrow['motivo'];
            $transacciones[$q]['referenciaUno'] = strval(number_format($myrow['referenciaUno'], 0, '', ''));
            $transacciones[$q]['referenciaDos'] = strval(number_format($myrow['referenciaDos'], 0, '', ''));
            $transacciones[$q]['saldo'] = formatear_moneda($myrow['saldo']);
            $transacciones[$q]['indicadorExcento'] = $myrow['indicadorExcento'];
            $transacciones[$q]['valorExcentos'] = formatear_moneda($myrow['valorExcentos']);
            $transacciones[$q]['canal'] = $myrow['canal'];
            $transacciones[$q]['causalDevolucion'] = $this->descripcionCD($myrow['causalDevolucion']);
            $transacciones[$q]['jornada'] = $myrow['jornada'];
            $q++;
        }
        return $transacciones;

        if ($transacciones) {
            return $transacciones;
        } else {
            return false;
        }
    }

    /**
     * Cuenta los registros de un archivo
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function contar_registros($file) {
        $linecount = 0;
        $handle = fopen($this->config['dir'] . $file, "r");
        while (!feof($handle)) {
            $line = fgets($handle);
            $linecount++;
        }
        return $linecount;
    }

    /**
     * Inserta un nuevo archivo
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function consultar_id_file($file, $xoopsDB) {

        $query = "SELECT `idregistro_archivo` FROM `siambiental_psa`.`registro_archivo` ";
        $query .= "WHERE `md5` = '$file'";

        $res = $xoopsDB->query($query);
        $myrow = $xoopsDB->fetchArray($res);

        return $myrow['idregistro_archivo'];
    }

    /**
     * Inserta un nuevo archivo
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function insert_file($file, $u_id, $xoopsDB) {
        $cantidad_registros = $this->contar_registros($file);
        $user_id = $u_id['value'];
        $query = "INSERT INTO `siambiental_psa`.`registro_archivo`(";
        $query .= "`fecha`, `usuario`, `md5`, `cantidadRegistros`) ";
        $query .= "VALUES (";
        $query .= "'" . date('Y-m-d H:i:s') . "', $user_id, '$file', $cantidad_registros)";
        $res = $xoopsDB->query($query);
        return $this->consultar_id_file($file, $xoopsDB);
    }

    /**
     * Inserta una nueva transaccion
     * @param object $xoopsDB conexión
     * @access public
     * @return string
     */
    public function insert($data, $id_archivo, $xoopsDB) {
        $campos = array();
        foreach ($this->config['campos'] as $campo => $opciones) {
            array_push($campos, $campo);
            $$campo = substr($data, $opciones['start'], $opciones['size']);
            if ($opciones['type'] == 'float') {
                $sizeNum = $opciones['size'] - $opciones['decimals'];
                $num = substr($$campo, 0, $sizeNum);
                $dec = substr($$campo, $sizeNum, $opciones['decimals']);
                $$campo = $num . '.' . $dec;
                settype($$campo, $opciones['type']);
            } else if ($opciones['type'] == 'date') {
                $fecha = $$campo;
                $$campo = date('Y-m-d', strtotime($fecha));
            } else {
                settype($$campo, $opciones['type']);
            }
        }
        $ins1 = '';
        $ins2 = '';
        $act = 0;
        foreach ($campos as $c) {
            $act ++;
            $ins1 .= "`" . $c . "`, ";
            $ins2 .= "'" . $$c . "', ";
        }
        $ins1 .= "`idregistro_archivo` ";
        $ins2 .= "'" . $id_archivo . "' ";

        $query = "INSERT INTO `siambiental_psa`.`registro_registro`(";
        $query .= $ins1 . ") ";
        $query .= "VALUES (";
        $query .= $ins2 . ")";
        $res = $xoopsDB->query($query);
        if (!$res) {
            return false;
        } else {
            $this->cant = $this->cant + 1;
            return true;
        }
    }

    /**
     * Carga el archivo en disco y lo deja listo para ser procesado.
     * 
     * @param type $file infromacion del archivo a cargar.
     * @return object
     */
    function cargar($file, $config, $xoopsDB, $user_id) {
        $this->config = $config;
        $this->procesar = 1;
        $target_dir = $this->config['dir'];
        $target_file = $target_dir . basename($file["cargaArchivo"]["name"]);
        $uploadOk = 1;
        $FileType = pathinfo($target_file, PATHINFO_EXTENSION);

        // Existencia del archivo
        if (file_exists($target_file)) {
            return "ERROR: Archivo ya ha sido cargado.";
            $uploadOk = 0;
        }
        // Tamaño
        if ($_FILES["cargaArchivo"]["size"] > $this->config['size']) {
            return "ERROR: Archivo demasiado grande. Tama&nacute;o m&aacute;ximo " . $this->config['size'];
            $uploadOk = 0;
        }
        // Formato
        if ($FileType != "csv") {
            return "ERROR: Solo estan peritidos archivos planos CSV";
            $uploadOk = 0;
        }
        // Verifica si tiene error
        if ($uploadOk == 0) {
            return "ERROR: El archivo no puede ser cargado.";
            // Todo bien sube
        } else {
//            $real_name = $_FILES["cargaArchivo"]["tmp_name"];
            $md5_name = md5_file($file["cargaArchivo"]["tmp_name"]);
            if (move_uploaded_file($file["cargaArchivo"]["tmp_name"], $target_dir . $md5_name)) {
//                $nombre_archivo = basename($file["cargaArchivo"]["name"]);
//                return "El archivo " . $nombre_archivo . " ha sido cargado.";
                $id_file = $this->insert_file($md5_name, $user_id, $xoopsDB);
                return $this->procesar($md5_name, $id_file, $xoopsDB);
            } else {
                return "ERROR: Ha ocurrido un error. Intentalo de nuevo.";
            }
        }
    }

    /**
     * Procesa el archivo cargado.
     * 
     * @param type $file infromacion del archivo a cargar.
     * @return object
     */
    function procesar($nombre_archivo, $id_archivo, $xoopsDB) {

        $res = '<br>Nombre del archivo: ' . $nombre_archivo;
        $archivo = fopen($this->config['dir'] . $nombre_archivo, "r");
        if ($archivo) {
            while (($line = fgets($archivo)) !== false) {

                $this->insert($line, $id_archivo, $xoopsDB);
            }
            return $res . '<br>Se han cargado ' . $this->cant . ' registros.';
        } else {
            return 'ERROR: No se pudo abrir el archivo.';
        }
        fclose($archivo);
    }

    function descripcionCD($causal) {
        switch ($causal) {
            case '0034':
                return 'Nota Credito';
            case '0035':
                return 'Deposito Normal';
            case '0036':
                return 'Deposito Especial';
            case '0039':
                return 'Deposito Plaza';
            case '0045':
                return 'Retiro Normal';
            case '0046':
                return 'Retiro Especial';
            case '0055':
                return 'Nota Debito';
            default :
                return '';
        }
    }

}

?>